function [U, V,objective] =HLPNMF(X,Options)
   X=X';
  [d,n]=size(X);
  [H, W,~] = constructHW(X',Options.p);
   invDe = diag(1./sum(H,2));
   S = H'*W*invDe*H;
   A=(S+S')/2;
   D = diag(sum(A, 2));   
   D_inv = D^(-1);       
   S = D_inv * A; 
   S1=S^Options.k;
 
    C=zeros(Options.SampNum, Options.SelectClasses);
    for i=1:Options.SampNum
          C(i,Options.SampGnd(i))=1;
    end
    U = rand(d, Options.SelectClasses);
    V = rand(n, Options.SelectClasses);
    objective=[];
    for iter = 1:Options.maxIter
          V(1:Options.SampNum,:)=  C;% 
          objective(iter)=norm(X - U * V', 'fro')^2+ Options.alpha*trace(V'*(eye(n)-S1)*V);
          U =U.*(X*V)./(U*V'*V+eps);
          V =V.*((X'*U+Options.alpha*S1*V)./(V*U'*U+Options.alpha*V+eps));% 
    end
end
